package br.com.gentech.commons.model.repository;

import java.util.List;
import java.util.Map;

import javax.ejb.Remote;

import br.com.gentech.commons.model.entity.BusinessException;
import br.com.gentech.commons.model.entity.IdentifiableEntity;

@Remote
public interface Repository<Entidade extends IdentifiableEntity<OID>, OID> {

	/**
	 * Persistir uma entidade nova ou edita os dados de uma entidade persistente, previamente criada, do repositório.
	 * 
	 * A decisão é tomada, se cria ou edita, baseado no preenchimento do identificador do objeto.
	 * Caso esteja preenchido é feito uma edição, caso não esteja, é criado um novo.
	 * 
	 * @param 
	 * 		unsaved Entidade nova
	 * @throws BusinessException 
	 */
	public abstract Entidade save(Entidade unsaved) throws BusinessException;

	public abstract void remove(Entidade saved) throws BusinessException;

	public abstract void remove(Class<Entidade> type, OID id);

	public abstract Entidade find(Class<Entidade> type, OID id);

	public abstract List<Entidade> find(Class<Entidade> type);

	public List<Entidade> findWithNamedQuery(Enum<?> namedQueryName);
	public List<Entidade> findWithNamedQuery(Enum<?> namedQueryName, Map<String, Object> parameters);
}